/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao.impl;

/**
 *
 * @author MauroH
 */
import dao.Conexao;
import dao.AgendouDAOException;
import dao.UsuarioDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import model.Usuario;

public class UsuarioDAOImpl implements UsuarioDAO {

    private Connection conn;

    public UsuarioDAOImpl() throws AgendouDAOException {
        try {
            conn = Conexao.getConnection();
        } catch (Exception e) {
            throw new AgendouDAOException("Erro: \n" + e.getMessage());
        }

    }

    @Override
    public void atualizar(Usuario usuario) throws AgendouDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        if (usuario == null) {
            throw new AgendouDAOException("Nenhum cliente informado.");
        }
        try {
            String sql = "UPDATE agendou.usuarios SET username=?, senha=?, nome=?, "
                    + "dt_nascimento=?, email=?, telefone=?, is_ativo=?, sexo=?, WHERE cpf=?";
            conn1 = conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, usuario.getUsername());
            ps.setString(2, usuario.getSenha());
            ps.setString(3, usuario.getNome());
            ps.setDate(4, usuario.getDt_nascimento());            
            ps.setString(6, usuario.getEmail());
            ps.setString(7, usuario.getTelefone());            
            ps.setBoolean(8, usuario.getAtivo());
            ps.setString(9, usuario.getSexo());
            ps.setString(10, usuario.getCpf());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw new AgendouDAOException("Erro ao atualizar o usuário. \n" + e);
        } finally {
            Conexao.closeConnection(conn1, ps);
        }

    }

    @Override
    public void excluir(Usuario usuario) throws AgendouDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        if (usuario == null) {
            throw new AgendouDAOException("Nenhum usuário informado.");
        }
        try {
            String sql = "UPDATE agendou.usuarios SET is_ativo = false WHERE cpf =?";
            conn1 = conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, usuario.getCpf());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw new AgendouDAOException("Erro ao excluir o usuário. \n" + e);
        } finally {
            Conexao.closeConnection(conn1, ps);
        }
    }

    @Override
    public void salvar(Usuario usuario) throws AgendouDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        if (usuario == null) {
            throw new AgendouDAOException("Nenhum usuario informado.");
        }
        
        Usuario user = this.procurarUsuario(usuario.getCpf());
        if(user == null){
            throw new AgendouDAOException("Usuário já cadastrado.");
        }
                   
        try {
            String sql = "INSERT INTO agendou.usuarios (username, senha, nome, dt_nascimento, email, telefone, is_admin, is_ativo, sexo, cpf)"
                    + " values(?,?,?,?,?,?,?,?,?,?)";
            conn1 = conn;
            ps = conn1.prepareStatement(sql);            
            ps.setString(1, usuario.getUsername());
            ps.setString(2, usuario.getSenha());
            ps.setString(3, usuario.getNome());
            ps.setDate(4, usuario.getDt_nascimento());            
            ps.setString(5, usuario.getEmail());
            ps.setString(6, usuario.getTelefone());            
            ps.setBoolean(7, false);            
            ps.setBoolean(8, true);
            ps.setString(9, usuario.getSexo());
            ps.setString(10, usuario.getCpf());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw new AgendouDAOException("Erro ao inserir o usuário. \n" + e);
        } finally {
            Conexao.closeConnection(conn1, ps);
        }
    }

    @Override
    public List<Usuario> todosUsuario() throws AgendouDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        ResultSet rs = null;
        try {
            String sql = "SELECT * FROM agendou.usuarios ";
            conn1 = conn;
            ps = conn1.prepareStatement(sql);
            rs = ps.executeQuery();
            List<Usuario> usuarios = new ArrayList<Usuario>();
            while (rs.next()) {
                Usuario user = new Usuario(rs.getString("cpf"), rs.getString("username"),
                        rs.getString("senha"), rs.getString("nome"),
                        rs.getDate("dt_nascimento"), rs.getString("sexo"), rs.getString("email"),
                        rs.getString("telefone"), rs.getBoolean("is_ativo"), rs.getBoolean("is_admin"));
                usuarios.add(user);
            }
            return usuarios;
        } catch (SQLException e) {
            throw new AgendouDAOException("Erro ao procurar cliente. \n" + e);
        } finally {
            Conexao.closeConnection(conn1, ps, rs);
        }

    }

    @Override
    public Usuario procurarUsuario(String cpf) throws AgendouDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        ResultSet rs = null;
        Usuario usuario = new Usuario();
        if (cpf == null || cpf.equals("")) {
            throw new AgendouDAOException("Nenhum CPF informado.");
        }
        try {
            String sql = "SELECT * FROM agendou.usuarios WHERE cpf=?";
            conn1 = conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, cpf);
            rs = ps.executeQuery();
            while (rs.next()) {
                usuario = new Usuario(rs.getString("cpf"), rs.getString("username"),
                        rs.getString("senha"), rs.getString("nome"),
                        rs.getDate("dt_nascimento"), rs.getString("sexo"), rs.getString("email"),
                        rs.getString("telefone"), rs.getBoolean("is_ativo"), rs.getBoolean("is_admin"));
            }
            return usuario;
        } catch (SQLException e) {
            throw new AgendouDAOException("Erro ao procurar cliente. \n" + e);
        } finally {
            Conexao.closeConnection(conn1, ps, rs);
        }
    }
    
    @Override
    public Usuario procurarUsuario(int idusuario) throws AgendouDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        ResultSet rs = null;
        Usuario usuario = new Usuario();
        if (idusuario == 0) {
            throw new AgendouDAOException("Nenhum ID de usuário informado.");
        }
        try {
            String sql = "SELECT * FROM agendou.usuarios WHERE idusuarios=?";
            conn1 = conn;
            ps = conn1.prepareStatement(sql);
            ps.setInt(1, idusuario);
            rs = ps.executeQuery();
            while (rs.next()) {
                usuario = new Usuario(rs.getString("cpf"), rs.getString("username"),
                        rs.getString("senha"), rs.getString("nome"),
                        rs.getDate("dt_nascimento"), rs.getString("sexo"), rs.getString("email"),
                        rs.getString("telefone"), rs.getBoolean("is_ativo"), rs.getBoolean("is_admin"));
            }
            return usuario;
        } catch (SQLException e) {
            throw new AgendouDAOException("Erro ao procurar cliente. \n" + e);
        } finally {
            Conexao.closeConnection(conn1, ps, rs);
        }
    }

    @Override
    public Usuario procurarUsuario(String username, String senha) throws AgendouDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        ResultSet rs = null;
        Usuario usuario = new Usuario();
        if (username == null || username.equals("") || senha == null || senha.equals("")) {
            throw new AgendouDAOException("Usuário ou senha não informado(s).");
        }
        try {
            String sql = "SELECT * FROM agendou.usuarios WHERE username=? AND senha=?";
            conn1 = conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, username);
            ps.setString(2, senha);
            rs = ps.executeQuery();
            while (rs.next()) {
//                    String nome = rs.getString("nome");
//                    String telefone_fixo = rs.getString("telefone_fixo");
//                    String telefone_celular = rs.getString("telefone_celular");
//                    String sexo = rs.getString("sexo");
//                    String data_nascimento = rs.getString("data_nascimento");
//                    String usuario1 = rs.getString("usuario");
//                    String senha1 = rs.getString("senha");
//                    String cpf = rs.getString("cpf");
//                    cliente = new Cliente(nome, telefone_fixo, telefone_celular, cpf,
//                        sexo, data_nascimento, usuario1, senha1);
                usuario = new Usuario(rs.getString("cpf"), rs.getString("username"),
                        rs.getString("senha"), rs.getString("nome"),
                        rs.getDate("dt_nascimento"), rs.getString("sexo"), rs.getString("email"),
                        rs.getString("telefone"),rs.getBoolean("is_ativo"),rs.getBoolean("is_admin"));
            }
            return usuario;
        } catch (SQLException e) {
            throw new AgendouDAOException("Erro ao procurar cliente. \n" + e);
        } finally {
            Conexao.closeConnection(conn1, ps, rs);
        }
    }
}
